home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Magazin: Amiga-CD 1995 October
/
Amiga-CD 1995 #10.iso
/
amiga-magazin
/
farbdithering
/
listing2
< prev
next >
Wrap
Text File
|
1995-08-30
|
2KB
|
49 lines
void DitherFS(Picture *Pic)
{
WORD *temp,*this,*next,*swap;
LONG x,y,v,r,pixel,index;
// Zwischenspeicher beschaffen
if(temp = (WORD *)AllocVec(sizeof(WORD) * (2 *
(1 + Pic -> Width + 1)),MEMF_ANY))
{ memset(temp,0,sizeof(WORD) * (2 * (1 + Pic -> Width + 1)));
// Die beiden Zeilenpuffer werden initialisiert
this = &temp[1]; next = &temp[1 + (1 + Pic -> Width + 1)];
for(y = 0 ; y < Pic -> Height ; y++)
{ for(x = 0 ; x < Pic -> Width ; x++)
{ // Position des Pixels bestimmen
index = x + y * Pic -> Width;
// Helligkeitswert berechnen (0 = Min, 255 = Max)
v = (Pic -> Red[index] + Pic -> Green[index] +
Pic -> Blue[index]) / 3;
v = this[x] + v; // Fehlerwert aufschlagen
// Ist die Helligkeit größer als der Schwellwert,
// ein weißes Pixel setzen, sonst ein schwarzes
if(v > 127) pixel = 255;
else pixel = 0;
// Der "Fehler" ist die Differenz zwischen dem
// berechneten Pixelwert und dem zu zeichnenden
r = v - pixel;
this[x + 1] += (7 * r) / 16; // 7/16 rechts
next[x - 1] += (3 * r) / 16; // 3/16 links unten
next[x ] += (5 * r) / 16; // 5/16 unten
next[x + 1] += ( r) / 16; // 1/16 rechts unten
// Das Pixel setzen
SetAPen(RPort,pixel); WritePixel(RPort,x,y);
}
// Der Inhalt der folgenden in die aktuelle Zeile
swap = this; this = next; next = swap;
// Die folgende Zeile wird gelöscht
memset(next,0,sizeof(WORD) * Pic -> Width);
}
FreeVec(temp);
}
}